/**
 * ************************************************************************
 *
 * @file    RingBuffer.c
 * @brief   简易环形数组
 * @author  负号科技(fuhaokj@foxmail.com)
 * @version 0.1
 * @date    2023-06-07
 *
 * ************************************************************************
 *   __       _                 _    _
 *  / _|     | |               | |  (_)
 * | |_ _   _| |__   __ _  ___ | | ___
 * |  _| | | | '_ \ / _` |/ _ \| |/ / |
 * | | | |_| | | | | (_| | (_) |   <| |
 * |_|  \__,_|_| |_|\__,_|\___/|_|\_\ |
 *                                 _/ |
 *                                |__/
 *
 * @copyright Copyright (c) 2023 负号科技
 * For study and research only, no reprinting
 * ************************************************************************
 */
#include "RingBuffer.h"

/**
 * @brief   环形数组初始化
 * @param   FIFO        数组实例
 * @date    2023-06-09
 *
 */
void RingBuffer_Init(RingBuffer *FIFO)
{
    FIFO->HeadPostion = 0;
    FIFO->HeadPostion = 0;
    FIFO->TailPostion = FIFO->HeadPostion;
    FIFO->Length = 0;
}

/**
 * @brief   出队一个数据
 * @param   FIFO        实例
 * @param   Dat         数据容器
 * @return  uint8_t 
 * @date    2023-08-03
 * 
 */
uint8_t Read_RingBuffer(RingBuffer *FIFO, uint8_t *Dat)
{
    uint8_t tempdata = 0; /*读出数据缓存*/

    if (FIFO->Length == 0) /*数组为空*/
    {
        return 0;
    }

    tempdata = FIFO->Buffer[FIFO->HeadPostion];               /*FIFO 从缓冲区头开始读*/
    FIFO->HeadPostion = (FIFO->HeadPostion + 1) % BUFFER_MAX; /*重新设置头位置防止越界访问*/

    if (FIFO->Length) /*长度不为零*/
    {
        FIFO->Length = FIFO->Length - 1; /*重新设置长度*/
    }

    *Dat = tempdata;

    return 1;
}

/**
 * @brief   单片机串口1接收中断处理函数
 * @param   recdata     中断或串口里面的数据（入队）
 * @return  uint8_t     0环形数组已满 1完成
 * @date    2023-06-06
 *
 */
uint8_t TFT_RX_ISR(RingBuffer *FIFO, uint8_t recdata)
{
    if (FIFO->Length >= BUFFER_MAX) /*环形数组缓冲区以满*/
    {
        return 0;
    }

    FIFO->Buffer[FIFO->TailPostion] = recdata;                /*给新来的数据放到尾部*/
    FIFO->TailPostion = (FIFO->TailPostion + 1) % BUFFER_MAX; /*更新尾部地址并防止越界访问*/
    FIFO->Length = FIFO->Length + 1;                          /*增加环形数组缓冲区长度*/
    return 1;
}
